package com.atguigu.springcloud.service;

import cn.hutool.core.util.IdUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.concurrent.TimeUnit;

/**
 * 2 * @Author: madonghui
 * 3 * @Date: 2020/10/30 17:19
 * 4
 */
@Service
public class PaymentService {


    public String paymentInfo_ok(Integer id){
        return "上海市啥时候"+Thread.currentThread().getName()+"ojbk";
    }

    @HystrixCommand(fallbackMethod = "paymentInfo_errorHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "4000")
    })
    public String paymentInfo_error(Integer id) throws InterruptedException {
        //int i = 10 / 0;
        TimeUnit.SECONDS.sleep(3);
        return "上海市啥时候"+Thread.currentThread().getName()+"noojbk";
    }

    public String paymentInfo_errorHandler(Integer id){
        return "响应出问题了"+Thread.currentThread().getName()+"┭┮﹏┭┮";
    }


    /* //服务熔断
     *
     * @Description: 服务熔断的注解
     *
     * @auther: madonghui
     * @date: 17:30 2020/11/1
     * @param:
     * @return:
     *
     */
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),//请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),//失败率达到多少后跳闸
    })
    public String paymentCircuitBreaker(@PathVariable("id")Integer id){
        if (id < 0){//HystrixCommandProperties熔断器的配置内容
            throw new RuntimeException("。。。。。id 不能为负数");
        }
        //hutool生成随机字符串的方法,相当于UUID.randomUUID().toString()并且去掉横线   详细请看hutool官网shi
        String s = IdUtil.simpleUUID();
        return Thread.currentThread().getName()+"\t"+"调用成功，流水号："+s;
    }

    public String paymentCircuitBreaker_fallback(@PathVariable("id")Integer id){
        return "id不能为负数，请稍后重试，/┭┮﹏┭┮/~~ id:"+id;
    }
}
